Elasticsearch 入門。その1
はじめに
prismatix事業部の中村です。
私が開発に携わっているEC/CRMのWebAPIプラットフォーム prismatix では検索サービスを提供しており、その内部では Elasticsearch を利用しています。
今回イチから Elasticsearch を勉強する機会がありましたので、構築方法や使い方を書いていこうと思います。
Elasticsearchとは
Elastic社が提供している Elastic Stackというプロダクト群に含まれる、分散処理が可能検索及び分析エンジンです。 Elastic Stack には、下記のプロダクトが存在します。
- Elasticsearch : 心臓部となるJSONベースの検索/分析エンジン
- Kibana : 検索、可視化用のUI
- Beats : アプリやインフラの統計情報等のデータ収集ツール
- Logstash : データ収集パイプライン
詳しくは、弊部横山の記事をご参照ください。
Elasticsearchの特徴
Elasticsearch には以下のような特徴があります。
- スケーラブル
- 扱うデータ量、リクエスト量に応じてスケールし分散処理が可能
- リアルタイム
- すべてのデータに対してほぼリアルタイムでの分析、検索が可能。数値、地理データでも効率的に計算を行える
- 開発者フレンドリー
- REST API を提供
- 高可用性
Elasticsearchのユースケース
例えば Elasticsearch は以下のようなケースで利用されています。
- Webサイトの検索機能
- ログやイベントデータの保存・分析
- 機械学習でリアルタイムにモデルを作成
- セキュリティ分析
- 地理情報を利用しての空間情報管理、分析
- 遺伝子データの分析
ローカルへのインストール
今回はMacにElasticsearchとKibanaをインストールしてみます。 HomeBrewでもインストール出来るのですが、公式からDLする形にします。
Elastic社の公式からElasticsearchとKibanaをDLしましょう。
DLしたファイルをそれぞれ解凍します。
% tar xvzf elasticsearch-7.13.2-darwin-x86_64.tar.gz % tar xvzf kibana-7.13.2-darwin-x86_64.tar.gz
Elasticsearch のディレクトリに移動し中身を確認してみます。
% ls LICENSE.txt README.asciidoc config jdk.app logs plugins NOTICE.txt bin data lib modules
Elasticsearch は JVM 上で動いており、以前は端末の JDK を利用していたようですが、Elasticsearch7 から JDK がバンドルされて配布しています。 (jdk.app
)
JVMの設定は、 config/jvm.options
で行えます。
% ls config elasticsearch.yml jvm.options.d role_mapping.yml users jvm.options log4j2.properties roles.yml users_roles
bin
にはパスワード設定やセキュリティ設定等の実行ファイルが設置してあります。
% ls bin elasticsearch elasticsearch-keystore elasticsearch-sql-cli elasticsearch-certgen elasticsearch-migrate elasticsearch-sql-cli-7.13.2.jar elasticsearch-certutil elasticsearch-node elasticsearch-syskeygen elasticsearch-cli elasticsearch-plugin elasticsearch-users elasticsearch-croneval elasticsearch-saml-metadata x-pack-env elasticsearch-env elasticsearch-service-tokens x-pack-security-env elasticsearch-env-from-file elasticsearch-setup-passwords x-pack-watcher-env elasticsearch-geoip elasticsearch-shard
起動
Elasticsearch を起動するには bin/elasticsearch
を実行します。
% ./bin/elasticsearch ### 以下のようなメッセージが出力されれば起動成功 [2021-07-01T15:01:54,182][INFO ][o.e.h.AbstractHttpServerTransport] [local] publish_address {127.0.0.1:9200}, bound_addresses {[::1]:9200}, {127.0.0.1:9200} [2021-07-01T15:01:54,183][INFO ][o.e.n.Node ] [local] started
次に、kibana を解凍したディレクトリに移動し起動 http://localhost:5601 からKibanaにアクセスが出来ます。
% cd kibana-7.13.2-darwin-x86_64 % ./bin/kibana ### 以下のようなメッセージが出力されれば起動成功 [info][server][Kibana][http] http server running at http://localhost:5601
Elasticsearch Security
Elasticsearch Security という機能が提供されており、認証機能や暗号化、ロールベースのアクセス制御などが簡単に行なえます。
例えば、Elasticsearchの bin/elasticsearch-setup-passwords
を実行し、Kibanaの設定ファイルに出力内容を記載することでログイン認証の設定を行えます。
Elasticsearch Security の機能は多岐に渡りますので、以下の公式ページをご参照ください。
https://www.elastic.co/jp/blog/getting-started-with-elasticsearch-security
KibanaでElasticsearchにリクエスト
Kibana には DevTools が実装されており、Elasticsearch に簡単にリクエスト出来ます。 portやエンドポイントを変更しない限り、 何も設定せずにローカルの Elasticsearch に繋いでくれます。
http://localhost:5601/app/dev_tools#/console
左側のフォームは Elasticsearch へのリクエストを入力、右側のフォームが Elasticsearch からのレスポンスが表示されます。
試しに、左側のフォームに GET /
を入力し実行ボタンを押すと Elasticsearch の API http://127.0.0.1:9200
にGETでリクエストをし、右側のフォームにレスポンスが表示されます。
このAPIはElasticsearchの情報を返してくれます。
これでローカルでの Elasticsearch と Kibana の環境が整いました。
データ
実際にデータを登録する前に、Elasticsearch のデータの取り扱いと用語について説明します。
ElasticsearchはデータをJSONで扱います。 そのデータを document と言います。
documentを保存する先は、 index と呼ばれ、 index に document を登録することを indexする(動詞)と言います。 (ややこしい)
document はJSONの為、フィールドと値を持ちます。
{ "field" : "value" }
各フィールドには型を定義することができ、それをmappingと言います。Elasticsearchではマッピングが未指定の場合、documentの値から自動で型を定義してくれます。
RDBで置き換えると以下のような形になります。
- index : DB
- field : カラム
- document : レコード
- mapping : スキーマ定義
type というのもあるのですが、現在は非推奨となっており将来的に廃止予定のため割愛します。
ES7では _doc
の1種類のみ対応しています。
登録
では実際にElasticsearchに登録していきます。
POST /<index>/_doc
API でbodyにindexしたいdocumentを指定します。
レスポンスには結果が返ってきます。
_id
にはElasticsearchが付与した、documentを示す一意のIDが割り当てられます。
この値を自分で指定したい場合、 POST /<target>/_create/<_id>
のAPIでIDを指定することも可能です。
_shards
にはindexしたshard情報が含まれています。ここらへんは次の機会に書く予定です。
index APIについては公式のドキュメントをご参照ください。
PUT
でもindex出来ますが、その際には _id の指定が必要となります。
取得
GET /<index>/_doc/<_id>
API で先程作成したdocumentの_idを指定します。
検索
documentを検索するには、 GET /<index>/_search
APIを呼びます。
bodyに条件を指定するのですが、下記の例では business_name
というフィールドに tokyo
という値を持ったdocumentを検索し1件HITしています。
{ "query": { "match": { "business_name": "tokyo" } } }
また、検索条件では tokyo
と小文字ですが、結果では Tokyo
と頭が大文字になっているのにも注目です。
Elasticsearchではデフォルトで値の大文字を小文字に変換して転置インデックスを作成しています。転置インデックスについても次回説明予定です。
複雑な条件も指定可能で、単語の重み付けや単語が連続していること等を指定が出来ます。
{ "query": { "bool": { "should": [ {"match": { "business_name" : { "query": "tokyo", "boost": 5 } }}, { "match_phrase": { "business_name": "tokyo francisco" } } ] } } }
検索方法は複数用意されているので、別途記載予定です。
削除
登録した document を削除するには DELETE /<index>/_doc/<_id>
を実行します。
index 毎削除したい場合、 DELETE /<index>
で全て削除が可能です。
最後に
今回はElasticsearchとKibanaをインストールし、簡単に触れる環境を作成しました。
次はElasticsearchの仕様等について書いていきたいと思います。